PHP cookiekaping en andere risico's
Home

PHP cookiekaping en andere risico's

PHP cookiekaping en andere risico's

Cookies zelf zijn onschadelijk omdat ze geen code kunnen en ook geen virussen kunnen bevatten of uitvoeren. Maar indirect kunnen cookies wel de oorzaak zijnvan kwaadwillende activiteiten waarbij jouw gegevens zijn betrokken.

Het zijn slechts tekstbestanden maar ze zijn uiterst kwetsbaar voor cookie-aanvallen. Andere toepassingen, spionagesoftware en andere cookies kunnen persoonlijke informatie zoals locatie, wachtwoorden, auto-aanvulgegevens, enz. verzamelen uit de cookies op jouw computer en deze informatie kwaadwillig gebruiken.

HTTP cookies

Cookies worden verstuurd in HTTP headers:

  1. Server response
    HTTP/1.1 200 OK
    ...
    Set-Cookie: userName=Jef
    
  2. Daaropvolgend client request
    GET /index.html HTTP/1.1
    ...
    Cookie: userName=Jef;

Cookie-kaping

De ongeautoriseerde toegang tot cookies heet "cookie-kaping" (cookie hijacking).

Als de hacker op de een of andere manier de sessie of permanente cookies in handen krijgt, is dat gevaarlijk omdat deze cookie-kaping een mogelijke dreiging vormt van ongeautoriseerde toegang tot websites waarop je eerder bent aangemeld. Met de gestolen cookies kan de hacker toegang krijgen tot de account van de gebruiker zonder inloggegevens in te voeren.

Cookiebeveiliging is een groot probleem in de internetwereld. Er worden steeds beveiligingslekken gevonden in verschillende browsers die onbedoeld persoonlijke informatie kunnen lekken naar kwaadwillende gebruikers.

Hoewel je cookies niet voor alle websites moet uitschakelen, aangezien deze mogelijk cookies nodig hebben voor een goede werking, kunt u cookies van derden zeker uitschakelen in uw browserinstellingen. Maak uw cache regelmatig leeg en blijf voorzichtig wanneer u onbekende websites bezoekt en daar uw persoonlijke gegevens doorgeeft.

Kwetsbaarheden

Denk eraan om, afhankelijk van de cookie-inhoud, de veiligheidsinstellingen voor cookies in te stellen. Dit is vooral belangrijk voor sessiecookies.

  1. De man-in-the-middle-aanval

    Cookies, die niet als secure zijn gemarkeerd, kunnen worden overgedragen via een niet-versleutelde verbinding. Een man-in-the-middle-aanval kan worden gebruikt om de inhoud van deze cookies te achterhalen. Je kan cookies als secure markeren op 2 manieren:

    opmerking:

    het attribuut Secure beschermt alleen de vertrouwelijkheid van een cookie tegen MiTM-aanvallers - er is geen integriteitsbescherming!

  2. Cross-Site-Scripting (XSS)

    Cookies die niet zijn gemarkeerd als HTTPOnly, kunnen worden gelezen door lokale scripts. In het geval van een Cross-Site-Scripting (XSS) aanval kan de aanvaller deze cookies lezen.

    opmerking: problemen met het HttpOnly -attribuut

    1. alleen vertrouwelijkheid in de praktijk beschermd
    2. HttpOnly-cookies kunnen worden vervangen door de koektrommel vanuit JavaScript te laten overlopen
  3. Het bereik van een cookie
    Het Path attribuut beperkt het bereik van een cookie tot een specifiek pad op de server en kan daarom worden gebruikt om ongeautoriseerde toegang te verhinderen vanuit andere websites op dezelfde host.
  4. Cookiedomein

    Het domain attribuut geeft een subdomein aan van servers die de cookie mogen zien. Wanneer het cookiedomein niet is ingesteld gebruikt de browser exact hetzelfde domein van de URL.

    opmerkingen:

    1. als het domein is ingesteld, worden cookies naar dat domein en al zijn subdomeinen gestuurd;
    2. het risico met subdomeinen is kleiner dan wanneer het bereik naar het bovenliggende domein beperkt is, maar nog steeds relevant
    3. verwijder het domein attribuut om de cookie te beperken tot de oorspronkelijke host alleen
  5. Het SameSite attribuut
    1. Probleem: cookies worden met alle verzoeken naar een server gestuurd, ongeacht de herkomst van het verzoek en aanvallers kunnen hiervan misbruik maken door geauthenticeerde cross-origin-verzoeken te initiëren, bijv. CSRF, XSSI, enz.
    2. Oplossing: nieuw cookie attribuut SameSite = [Strict | Lax], voorkomt dat cookies worden gekoppeld aan cross-origin-verzoeken
  6. Het lifetime/expires attribuut is optioneel;
    1. het kan worden gebruikt om de vervaltijd van de cookie in te stellen, bijvoorbeeld 1 uur. De tijd wordt ingesteld met behulp van de PHP-functie time plus of min een aantal seconden groter dan 0, bijvoorbeeld time() + 3600 voor 1 uur.
    2. indien het attribuut een negatieve waarde heeft, stuurt de server een antwoord met het verzoek de cookie te verwijderen;
  7. Cookievoorvoegsels
    1. Probleem: server ziet alleen cookienaam en -waarde in het HTTP-verzoek, geen informatie over de attributen ervan, de server kan niet weten of een cookie die hij ontvangt veilig is ingesteld
    2. Oplossing: smokkel informatie naar server in cookienaam door gebruik te maken van prefixen: __Secure- en __Host-

      Cookienamen met het voorvoegsel __Secure- of __Host- kunnen alleen worden gebruikt als ze zijn ingesteld met het secure attribuut voor een veilige (HTTPS) oorsprong.

      Bovendien moeten cookies met het voorvoegsel __Host- een Path attribbut hebben ingesteld op / (dat wil zeggen elk pad op de host) en mogen ze geen Domain-attribuut hebben.

Cookies versturen vanaf de server met PHP

  1. Cookies: setcookie
    Deze functie kan je op twee manieren gebruiken:
    1. met individuele parameters:
      setcookie(string $name , string $value = "" , int $expires = 0 , string $path = "" , string $domain = "" , 
                  bool $secure = false , bool $httponly = false) : bool
      

      bijvoorbeeld:

      setcookie('userName', $userName, 0, '/Testers', '', false, true);
    2. of met een $options array (vanaf PHP 7.3.0). Let erop dat er 1 paramger bijgekomen is, namelijk samesite:

      setcookie ( string $name , string $value = "" , array $options = [] ) : bool

      Per default ziet de $options array er zo uit:

      $cookieParams = array(
          'expires' => 0,
          'path' => "/",
          'domain' => '',
          'secure' => false,
          'httponly' => false,
          'samesite' => '');

      Om de cookie in te stellen op HttpOlny, SameSite=Strict en te laten verlopen na 5 seconden:

      $cookieParams = array(
          'expires' => time() + 5,
          'path' => '/',
          'domain' => '',
          'secure' => false,
          'httponly' => true,
          'samesite' => 'Strict');
      setcookie('userName', $userName, $cookieParams);

      Om een cookie te verwijderen maak je een cookie met dezelfde naam en zet je de waarde ervan in op een lege string en de verlooptijd in op een moment ergens in het verleden:

      $cookieParams = array(
          'expires' => time() - 42000,
          'path' => '/',
          'domain' => '',
          'secure' => false,
          'httponly' => true,
          'samesite' => 'Strict');
      setcookie('userName', '', $cookieParams);
  2. Session-cookies
    1. Het /etc/php/php.ini bestand aanpassen

      Je kan de php.ini settings opvragen met de phpinfo functie.

      De volgende attributen kan je in het /etc/php/php.ini bestand aanpassen:

      Directive Local Value Master Value
      session.cookie_domain no value no value
      session.cookie_httponly no value no value
      session.cookie_lifetime 0 0
      session.cookie_path / /
      session.cookie_samesite no value no value
      session.cookie_secure 0 0

      Je moet wel toegang hebben tot het bestand en deze settings zijn voor alle pagina's die door webserver verstuurd worden geldig.

      Je kan bijvoorbeeld:

      session.cookie_domain="modernways.be"
      session.cookie_httponly=On
      session.cookie_lifetime=3600
      session.cookie_path="c:/apps/myaa.modernways"
      session.cookie_samesite="Lax" of session.cookie_samesite="Strict"
      session.cookie_secure=On
      

    2. als je geen toestemming hebt om het php.ini-bestand te wijzigen, kan dit worden gedaan met behulp van de functie ini_set:
      ini_set('session.cookie_domain','modernways.be');
      echo ini_get('session.cookie_domain');
      ini_set('session.cookie_secure',1);
      echo ini_get('session.cookie_secure');
      ini_set('session.cookie_samesite', 'strict');
      echo ini_get('session.cookie_samesite');
      ini_set('session.cookie_path','c:/xxx');
      echo ini_get('session.cookie_path');
      

    3. je kan de attributen van de sessiecookie ook instellen met de functie session_set_cookie_params. Daar zijn twee versies van:
      1. Voor elke attribuut een aparte parameter:
        session_set_cookie_params ( int $lifetime , string|null $path = null , string|null $domain = null , 
               bool|null $secure = null , bool|null $httponly = null ) : bool

        voorbeeld:

        session_set_cookie_params(0, '/', '.modernways.be', true, true);
      2. Eén parameter, een array:
        session_set_cookie_params ( array $options ) : bool
        

        met de volgende items:

        $cookieParams = array('lifetime' => 0,
                            'path' => '/',
                            'domain' => '',
                            'secure' => false,
                            'httponly' => false,
                            'samesite' => '');
        session_set_cookie_params($cookieParams);
        

        een veiliger voorbeeld:

        $cookieParams = array('lifetime' => 0,
            'path' => '/',
            'domain' => '',
            'secure' => false,
            'httponly' => true,
            'samesite' => 'Strict');
        session_set_cookie_params($cookieParams);
        
    4. Een combinatie van de php.ini instellingen en lokale settings
      1. Je haalt de instellingen uit het /etc/php/php.ini bestand op met:
        // Gets current cookies params
        $cookieParams = session_get_cookie_params();
      2. En combineert die met lokale instellingen, we nemen de lifetime over van php.ini en de rest bepalen we lokaal:
        $options = array('lifetime' => $cookieParams["lifetime"],
            'path' => '/',
            'domain' => '',
            'secure' => true,
            'httponly' => true,
            'samesite' => 'Strict');
      3. Tenslotte stellen we de cookie parameters lokaal opnieuw in:
        session_set_cookie_params($options );

Bronnen

  1. WebsitePolicies, What Are Cookies & Why Are They Important, Updated on April 7, 2021
  2. Stanford, CS 253 Web Security, Fall 2019

  3. David Johansson, Cookie Security Myths and Misconceptions –OWASP, London 30 Nov. 2017

JI
2021-04-17 07:57:39